/**
 * 工厂方法
 */

// 工厂方法模式，将实际创建对象的工作放到子类当中进行，工厂只是一个接收创建命令的入口

function factory(type, name) {
  if (this instanceof factory) {
    let o = new this[type](name);
    return o;
  } else {
    // 这是一个安全模式类，避免对工厂的错误调用
    // 如果直接调用了工厂而不是通过new来创建工厂对象，会进行一次保护
    return new factory(type, name);
  }
}

factory.prototype = {
  dog: function (name) {
    this.name = name;
    this.run = function () {
      console.log("run!");
    };
  },
  fish: function (name) {
    this.name = name;
    this.swim = function () {
      console.log("swim!");
    };
  },
};

let dog = new factory("dog", "husky");
dog.run();
let fish = new factory("fish", "salmon");
fish.swim();
